;This file is part of C45IDL.
;
;C45IDL is free software: you can redistribute it and/or modify
;it under the terms of the GNU Lesser General Public License as published by
;the Free Software Foundation, either version 3 of the License, or
;(at your option) any later version.
;
;C45IDL is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;GNU Lesser General Public License for more details.
;
;You should have received a copy of the GNU Lesser General Public License
;along with C45IDL.  If not, see <http://www.gnu.org/licenses/>. 

;---------------------------------------------------------------------------------------------------------------
; Arquivo: carregarAmostrasTreinamento.pro
; Objetivo:
;  Ler as amostras no formato .txt do Envi e armazená-las em estrutura (array) ou vetores separadamente
; Entradas: 
;  Arquivo ".txt" contendo as amostras extraidas no Envi e o número de bandas
; Saidas: 
;  Uma estrutura para amostras que coném os valores dos pixels de cada banda, um vetor com o 
;  numero de pixel de cada amostra, um vetor com os endereços de cada amostra e um vetor com as classes 
;  de cada amostra
; Autor: Marinalva Dias Soares e Maurício C. M. de Paulo
; Data: 15/07/2011
; Observacoes: 
;  1. Olhar a estrutura das amostras do Envi no arquivo texto para entender o funcionamento deste procedimento
;  2. As amostras de uma mesma classe são empacotadas juntas no arquivo do Envi (dá para diferenciá-las pela 
;     mudança de endereço - descontinuidade)
; Historico de Mudanças:
;  Nenhuma
;---------------------------------------------------------------------------------------------------------------

FUNCTION carregarAmostrasTreinamentoF, file;, bandas
 ;saída do procedimento (variaveis globais para serem usadas em outras rotinas)
 ;common TREINO, amostras, nBandas, classes, enderecos 
 if ~ n_elements(file) then begin
    file = DIALOG_PICKFILE(FILTER = '*.txt')
 endif
  ;if file doesn't exists, return 0
 if ~ FILE_TEST(file) then return, 0
  
 ;Seleciona um arquivo texto e o abre para leitura   
 OPENU, unit, file, /GET_LUN
 ;cria e inicializa uma variável para ler cada linha do arquivo
 line=''
 
 ;lendo cabecalho do arquivo .txt do Envi
 READF, unit, line ;lê a primeira linha do arquivo
 READF, unit, line ;lê a segunda linha que contém o numero de rois 
 
 nr = strsplit(line,'; Number of ROIs: ',/extract) ;extrai o que está após o texto entre aspas e armazena em nr
 numeroAmostras = fix(nr) ;transforma o numero de amostras em inteiro
 nAmostras = numeroAmostras[0]
  
 ;cria uma estrutura para armazenar o identificador e nome da classe da amostra
 classes = replicate({identificador:0, nome:''}, nAmostras) 
 numPixelsAmostra = intarr(nAmostras) ; cria um array para armazenar o numero de pixels de cada amostra

 ;lê a linha que contem a dimensao do arquivo
 READF, unit, line 
 
 ;a estrutura de repeticao abaixo armazena o numero de pixels de cada amostra
 countAmostras=0L
 for cont=0L, nAmostras-1 do begin  
     ;cada amostra tem as linhas abaixo   
     READF, unit, line ;le a linha de ponto-e-virgula
     READF, unit, line ;lê a linha que contem o nome da amostra
     nomeClasse = strsplit(line,'; ROI name: ',/extract, /regex)
     classes[cont].identificador = cont+1 ;armazena o identificador da classe
     classes[cont].nome = nomeClasse
     READF, unit, line ; lê a linha que contem a cor da amostra
     READF, unit, line ; lê a linha que contem o numero de pixels da amostra
     nPixels = strsplit(line,'; ROI npts: ',/extract)
     countAmostras+=LONG(nPixels)
     numPixelsAmostra[cont] = nPixels ;armazena o nr de pixels da amostra     
 endfor
 
 ;le a ultima linha antes de comecar os dados
 READF, unit, line
 lineBandas = strsplit(line,'B',/extract)
 nBandas=n_elements(lineBandas)-1
 colunas=strsplit(line,' ',/extract,/regex)
 inicioBandas=(where(colunas eq 'B1'))[0]-1
 
 ;cria uma estrutura de amostras para armazenar os valores dos pixels de todas as bandas de cada amostra 
 ;o vetor "values" tem a dimensão numero de pixels (da maior amostra) x numero de bandas)  

 
 padroes=FLTARR(countAmostras,nBandas+1) ;vetor de padroes de treinamento
 
 cont=0L ;contador para amostras
 pixel=0L ;contador para pixels de cada amostra, o vetor de padroes será um para todo o treinamento.
 ;contBandas=0 ;contador para bandas
 
 ;começa a ler os valores dos pixels de cada amostra
 while not eof(unit) do begin      
   READF, unit, line   
   ;A linha em branco é o separador de amostras
   if (line eq '') then begin 
    cont+=1 ;aumenta o contador para a próxima amostra 
    READF, unit, line ;lê a primeira linha da proxima amostra
   endif  
   ;coloca os valores da linha lida em um array (a estrutura da linha é: endereco e bandas1,bandas1...bandasN
   ;le a linha e transforma para int
   values=(float(strsplit(line, ' ',/extract,/regex)))[inicioBandas-3:*]
   problems=where(~finite(values))
   if problems[0] ne -1 then values[problems]=-32000
   padroes[pixel,*] = values
   padroes[pixel,0]=cont
   pixel+=1 
 endwhile
 ;Fecha o arquivo e libera a unidade do arquivo
 dec=1
 ;padroes=round(padroes*10.^dec)/10.^dec
 free_lun, unit
 return, padroes
end

;procedure to export the training samples read using ENVI's ROI Tool to a csv file
PRO envi2weka
  padroes=carregaramostrastreinamentoF()
  print, "Conversor de arquivos ROI para CSV"
  print, "Entre com o arquivo de entrada: ROI ASCII"
  file = DIALOG_PICKFILE(FILTER='*.csv',/WRITE)   
  n=n_elements(padroes[0,*])
  saida=StrTrim(transpose(padroes),2)
  saida[1:n-2, *] = saida[1:n-2, *] + ','
  pattern = '(' + StrTrim(n,2) + '(A,:, ","))'
  ;pattern='('+STRTRIM(n)+'(A,:,","))'
  ;Coloca "Classe" na coluna do nome da classe.
  saida[0,*]="Classe "+strtrim(FIX(saida[0,*]),1)+','
  OPENW, unit,file,WIDTH=500, /GET_LUN
  cabecalho=INDGEN(n)
  cabecalho="A"+strtrim(FIX(cabecalho),1)
  cabecalho[0:n-2]=cabecalho[0:n-2]+','
  cabecalho[0:0]="Classe,"
  printf, unit, cabecalho
  printf, unit,saida
  Free_Lun, unit
  print, "Fim do processo"
END